// #include <sys/types.h>
// #include <sys/stat.h>
// #include <sys/mman.h>
// #include <unistd.h>
// #include <fcntl.h>
// #include <stdio.h>



// /*
// 	功能：切换BMP图片特效“圆形扩散”。
// 	参数：
// 		char *pathname：图片的路径。
// 		int *pic_circular_spread_fd：被映射区的指针。
// 	返回值：成功  0
// 			失败  -1	
// */
// // int pic_circular_spread(char *pathname)
// // {	
// // 	int ret=0;
// // 	int line=0;
// // 	int block=0;
// // 	int i=0, j=0, k=0;
// // 	int bmp_fd=0;
	
// // 	char bmp_buf[480*800*3];
// // 	int mi_buf[480*800];	
// // 	int temp_buf[480*800];	
// // 	// bzero(mi_buf,sizeof(mi_buf));
// // 	// bzero(bmp_buf,sizeof(bmp_buf));
// // 	// bzero(temp_buf,sizeof(temp_buf));

// //     //1.打开液晶屏文件
// //     int lcdfd = open("/dev/fb0",O_RDWR);
// //     if(lcdfd == -1)
// //     {
// //         printf("打开液晶屏失败\n");
// //         return 0;
// //     }

// // 	bmp_fd = open(pathname, O_RDONLY);//1、打开BMP格式图片
// // 	if(bmp_fd == -1)
// // 	{
// // 		printf("pic_circular_spread(), open bmp failed\n");
// // 		return -1;
// // 	}

// // 	ret = lseek(bmp_fd, 54 , SEEK_SET);//2、跳过bmp图片的前54个位置
// // 	if(ret == -1)
// // 	{
// // 		perror("pic_circular_spread(), lseek bmp failed\n");		
// // 		return -1;
// // 	}

// // 	ret = read(bmp_fd , bmp_buf , sizeof(bmp_buf)); //4、取读图片像素
// // 	if(ret == -1)
// // 	{
// // 		printf("pic_circular_spread(), read bmp failed\n");	
// // 		return -1;
// // 	}
	
// // 	close(bmp_fd);//5、关闭图片

// // 	for(i=0, j=0 ; i<800*480 ; i++, j+=3)//6、24bits 转 32bits控制变量
// // 	{
// // 		temp_buf[i] = bmp_buf[j+2]<<16 | bmp_buf[j+1]<<8 | bmp_buf[j] ;
// // 	}

// // 	for(line=0 ; line <=480 ;line++)//7、解决图片上下颠倒问题
// // 	{
// // 		for(i=0; i<=800 ; i++)
// // 		mi_buf[800*line + i] = temp_buf[ (479-line)*800 + i ];
// // 	}


// //     //内存映射   
// //     char *p = mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcdfd,0);
// // 	for(k=0; k<467; k+=3)//8、特殊动画“圆形扩散”效果算法
// // 	{
// // 		for(i=0; i<480; i++)
// // 		{
// // 			for(j=0; j<800; j++)
// // 			{
// // 				if((j-400)*(j-400)+(i-240)*(i-240) <= k*k)
// // 				{
// // 					p[800*i+j] = mi_buf[800*i+j];					
// // 				}
// // 			}
// // 		}
// // 	} 

// // 	return 0;
// // }



// // int show_bmp(char *bmpname)
// // {
// //     //1.打开液晶屏文件
// //     int lcdfd = open("/dev/fb0",O_RDWR);
// //     if(lcdfd == -1)
// //     {
// //         printf("打开液晶屏失败\n");
// //         return 0;
// //     }
// //     //2.打开bmp图片文件
// //     int bmpfd = open(bmpname,O_RDWR);
// //     if(bmpfd == -1)
// //     {
// //         printf("打开图片失败\n");
// //         return 0;
// //     }
// //     //内存映射   
// //     char *p = mmap(NULL,800*480,PROT_READ|PROT_WRITE,MAP_SHARED,lcdfd,0);

// //     //3.读取bmp图片的数据
// //     char buf[800*480*3]={0};//800*480:图片像素点总数 *3：C的代码单位是字节
// //     //跳过表示图片信息的54个字节
// //     read(bmpfd,buf,54);
// //     read(bmpfd,buf,800*480*3);
// //     //添加一个字节
// //     char bmp[800*480*4]={0};//每个像素点加入一个字节所以大小变成*4
// //     for(int i=0,j=0;i<800*480*3;i+=3,j+=4)//i+=3:表示每隔RGB加入一个字节,j+=4:表示跳过ARGB
// //     {
// //         bmp[j]=buf[i];
// //         bmp[j+1]=buf[i+1];
// //         bmp[j+2]=buf[i+2];
// //         bmp[j+3]=0;
// //     }
// // //     //4.将读取出来的图片数据写入到液晶屏上
// // //     for(int i=0;i<800*480*4;i++)
// // //     {
// // //        p[i]=bmp[i];
// // //     }

// //     // 	int ret=0;
// // 	int line=0;
// // // 	int block=0;
// // 	int i=0, j=0, k=0;
// // // 	int bmp_fd=0;
// // 	int mi_buf[480*800];
// // 	for(line=0 ; line <=480 ;line++)//7、解决图片上下颠倒问题
// // 	{
// // 		for(i=0; i<=800 ; i++)
// // 		mi_buf[800*line + i] = bmp[ (479-line)*800 + i ];
// // 	}

// // 	for(k=0; k<467; k+=3)//8、特殊动画“圆形扩散”效果算法
// // 	{
// // 		for(i=0; i<480; i++)
// // 		{
// // 			for(j=0; j<800; j++)
// // 			{
// // 				if((j-400)*(j-400)+(i-240)*(i-240) <= k*k)
// // 				{
// // 					p[800*i+j] = mi_buf[800*i+j];					
// // 				}
// // 			}
// // 		}
// // 	} 
// //     // //4.将读取出来的图片数据写入到液晶屏上
// //     // for(int i=0;i<800*480*4;i++)
// //     // {
// //     //    p[i]=mi_buf[i];
// //     // }

// //     //5.关闭液晶屏文件、bmp图片文件
// //     close(lcdfd);
// //     close(bmpfd);
// //     return 0;
// // }








// // #include "show_bmp.h"

// // #include <sys/types.h>
// // #include <sys/stat.h>
// // #include <sys/mman.h>
// // #include <unistd.h>
// // #include <fcntl.h>
// // #include <stdio.h>
// /*
// 图片特效：
// 	1）“圆形扩散”    2）”圆形收缩“   
// 	3）”向下飞入“    4）”向上飞入“   5）”向左飞入“   6）”向右飞入“
// 	7）”横百叶窗“    8）”竖百叶窗“    9）“左右相合”   10）“中间展开”
// 	11）“斜方块”
// */

// /*
// 	功能：显示800*480大小的bmp图片。
// 	参数：
// 		char *pathname：要显示图片的名字。
// 		int *show_1152000bmp_fd：被映射区的指针。
// 	返回值：成功  0
// 			失败  -1
// */
// // int show_1152000bmp(char *pathname, char *show_1152000bmp_fd)
// // {
// // 	//1、打开BMP格式图片和lcd显示屏
// // 	int fd_bmp = open(pathname,  O_RDWR);
// // 	if(fd_bmp == -1)
// // 	{
// // 		printf("show_1152000bmp(), open bmp fail!\n");
// // 		return -1;
// // 	}
	
// // 	//2、去掉54个字节
// // 	int ret = lseek(fd_bmp, 54, SEEK_SET);
// // 	if(ret == -1)
// // 	{
// // 		printf("show_1152000bmp(), lseek bmp fail!\n");
// // 		return -1;		
// // 	}
	
// // 	//3、读取BMP数据到lcd屏幕中
// // 	char bmp_buf[800*480*3];
// // 	int lcd_buf[800*480];
// // 	// bzero(bmp_buf, 800*480*3);
// // 	// bzero(lcd_buf, 800*480);
	
// // 	ret = read(fd_bmp, bmp_buf, 800*480*3);//BMP数据放到了bmp_buf中
// // 	if(ret == -1)
// // 	{
// // 		printf("show_1152000bmp(), read bmp fail!\n");
// // 		return -1;		
// // 	}		

// // 	//4、关闭文件，回收资源
// // 	close(fd_bmp);
	
// // 	//5、800*480个A像素变成800*480个B像素算法。
// // 	int i;
// // 	for(i=0; i<800*480; i++)
// // 	{
// // 		lcd_buf[i] = bmp_buf[i*3]<<0 | bmp_buf[i*3+1]<<8 | bmp_buf[i*3+2]<<16;
// // 		//lcd_buf[0] = bmp_buf[0]<<0 | bmp_buf[1]<<8 | bmp_buf[2]<<16;
// // 		//lcd_buf[1] = bmp_buf[3]<<0 | bmp_buf[4]<<8 | bmp_buf[5]<<16;
// // 		//lcd_buf[2] = bmp_buf[6]<<0 | bmp_buf[7]<<8 | bmp_buf[8]<<16;
// // 	}
	
// // 	//6、lcd_buf数据（DDR2中的数据）通过mmap显示到LCD屏幕中。
// // /*
// // 	for(i=0; i<800*480; i++)
// // 	{
// // 		*(lcd_mmap+i)=lcd_buf[i];
// // 	}	
// // */
// // 	int x, y;
// // 	for(y=0; y<480; y++)//优化算法，解决图片颠倒问题
// // 	{
// // 		for(x=0; x<800; x++)
// // 		{
// // 			*(show_1152000bmp_fd+800*(479-y)+x)= lcd_buf[800*y+x];
// // 		}
// // 	}
			
// // 	return 0;
// // }















// int show_bmp(char *bmpname)
// {
//     //1.打开液晶屏文件
//     int lcdfd = open("/dev/fb0",O_RDWR);
//     if(lcdfd == -1)
//     {
//         printf("打开液晶屏失败\n");
//         return 0;
//     }
//     //2.打开bmp图片文件
//     int bmpfd = open(bmpname,O_RDWR);
//     if(bmpfd == -1)
//     {
//         printf("打开图片失败\n");
//         return 0;
//     }
//     //内存映射   
//     char *p = mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcdfd,0);

//     //3.读取bmp图片的数据
//     char buf[800*480*3]={0};//800*480:图片像素点总数 *3：C的代码单位是字节
//     //跳过表示图片信息的54个字节
//     read(bmpfd,buf,54);
//     read(bmpfd,buf,800*480*3);
//     //添加一个字节
//     // char bmp[800*480*4]={0};//每个像素点加入一个字节所以大小变成*4
//     // for(int i=0,j=0;i<800*480*3;i+=3,j+=4)//i+=3:表示每隔RGB加入一个字节,j+=4:表示跳过ARGB
//     // {
//     //     bmp[j]=buf[i];
//     //     bmp[j+1]=buf[i+1];
//     //     bmp[j+2]=buf[i+2];
//     //     bmp[j+3]=0;
//     // }
//     // 	//3、读取BMP数据到lcd屏幕中
// // 	char bmp_buf[800*480*3];
// 	int lcd_buf[800*480];
// // 	// bzero(bmp_buf, 800*480*3);
// // 	// bzero(lcd_buf, 800*480);
	
// // 	ret = read(fd_bmp, bmp_buf, 800*480*3);//BMP数据放到了bmp_buf中
// // 	if(ret == -1)
// // 	{
// // 		printf("show_1152000bmp(), read bmp fail!\n");
// // 		return -1;		
// // 	}		

// // 	//4、关闭文件，回收资源
// // 	close(fd_bmp);
	
// 	//5、800*480个A像素变成800*480个B像素算法。
// 	int i;
// 	for(i=0; i<800*480; i++)
// 	{
// 		lcd_buf[i] = buf[i*3]<<0 | buf[i*3+1]<<8 | buf[i*3+2]<<16;
// 		//lcd_buf[0] = bmp_buf[0]<<0 | bmp_buf[1]<<8 | bmp_buf[2]<<16;
// 		//lcd_buf[1] = bmp_buf[3]<<0 | bmp_buf[4]<<8 | bmp_buf[5]<<16;
// 		//lcd_buf[2] = bmp_buf[6]<<0 | bmp_buf[7]<<8 | bmp_buf[8]<<16;
// 	}
	
// 	//6、lcd_buf数据（DDR2中的数据）通过mmap显示到LCD屏幕中。

// 	for(i=0; i<800*480; i++)
// 	{
// 		*(p+i)=lcd_buf[i];
// 	}	

// 	int x, y;
// 	for(y=0; y<480; y++)//优化算法，解决图片颠倒问题
// 	{
// 		for(x=0; x<800; x++)
// 		{
// 			*(p+800*(479-y)+x)= lcd_buf[800*y+x];
// 		}
// 	}
//     // int x, y;
// 	// for(y=0; y<480; y++)//优化算法，解决图片颠倒问题
// 	// {
// 	// 	for(x=0; x<800; x++)
// 	// 	{
// 	// 		*(p+800*(479-y)+x)= bmp[800*y+x];
// 	// 	}
// 	// }
//     // //4.将读取出来的图片数据写入到液晶屏上
//     // for(int i=0;i<800*480*4;i++)
//     // {
//     //    p[i]=bmp[i];
//     // }
//     //write(lcdfd, bmp, 800*480*4);
//     //5.关闭液晶屏文件、bmp图片文件
//     close(lcdfd);
//     close(bmpfd);
//     return 0;
// }

// int main()
// {
//     show_bmp("1.bmp");
//     //内存映射   
//     // char *p = mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcdfd,0);
//     // pic_circular_spread("1.bmp");
// }










#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>



/*
	功能：切换BMP图片特效“圆形扩散”。
	参数：
		char *pathname：图片的路径。
		int *pic_circular_spread_fd：被映射区的指针。
	返回值：成功  0
			失败  -1	
*/
// int pic_circular_spread(char *pathname)
// {	
// 	int ret=0;
// 	int line=0;
// 	int block=0;
// 	int i=0, j=0, k=0;
// 	int bmp_fd=0;
	
// 	char bmp_buf[480*800*3];
// 	int mi_buf[480*800];	
// 	int temp_buf[480*800];	
// 	// bzero(mi_buf,sizeof(mi_buf));
// 	// bzero(bmp_buf,sizeof(bmp_buf));
// 	// bzero(temp_buf,sizeof(temp_buf));

//     //1.打开液晶屏文件
//     int lcdfd = open("/dev/fb0",O_RDWR);
//     if(lcdfd == -1)
//     {
//         printf("打开液晶屏失败\n");
//         return 0;
//     }

// 	bmp_fd = open(pathname, O_RDONLY);//1、打开BMP格式图片
// 	if(bmp_fd == -1)
// 	{
// 		printf("pic_circular_spread(), open bmp failed\n");
// 		return -1;
// 	}

// 	ret = lseek(bmp_fd, 54 , SEEK_SET);//2、跳过bmp图片的前54个位置
// 	if(ret == -1)
// 	{
// 		perror("pic_circular_spread(), lseek bmp failed\n");		
// 		return -1;
// 	}

// 	ret = read(bmp_fd , bmp_buf , sizeof(bmp_buf)); //4、取读图片像素
// 	if(ret == -1)
// 	{
// 		printf("pic_circular_spread(), read bmp failed\n");	
// 		return -1;
// 	}
	
// 	close(bmp_fd);//5、关闭图片

// 	for(i=0, j=0 ; i<800*480 ; i++, j+=3)//6、24bits 转 32bits控制变量
// 	{
// 		temp_buf[i] = bmp_buf[j+2]<<16 | bmp_buf[j+1]<<8 | bmp_buf[j] ;
// 	}

// 	for(line=0 ; line <=480 ;line++)//7、解决图片上下颠倒问题
// 	{
// 		for(i=0; i<=800 ; i++)
// 		mi_buf[800*line + i] = temp_buf[ (479-line)*800 + i ];
// 	}


//     //内存映射   
//     char *p = mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcdfd,0);
// 	for(k=0; k<467; k+=3)//8、特殊动画“圆形扩散”效果算法
// 	{
// 		for(i=0; i<480; i++)
// 		{
// 			for(j=0; j<800; j++)
// 			{
// 				if((j-400)*(j-400)+(i-240)*(i-240) <= k*k)
// 				{
// 					p[800*i+j] = mi_buf[800*i+j];					
// 				}
// 			}
// 		}
// 	} 

// 	return 0;
// }



// int show_bmp(char *bmpname)
// {
//     //1.打开液晶屏文件
//     int lcdfd = open("/dev/fb0",O_RDWR);
//     if(lcdfd == -1)
//     {
//         printf("打开液晶屏失败\n");
//         return 0;
//     }
//     //2.打开bmp图片文件
//     int bmpfd = open(bmpname,O_RDWR);
//     if(bmpfd == -1)
//     {
//         printf("打开图片失败\n");
//         return 0;
//     }
//     //内存映射   
//     char *p = mmap(NULL,800*480,PROT_READ|PROT_WRITE,MAP_SHARED,lcdfd,0);

//     //3.读取bmp图片的数据
//     char buf[800*480*3]={0};//800*480:图片像素点总数 *3：C的代码单位是字节
//     //跳过表示图片信息的54个字节
//     read(bmpfd,buf,54);
//     read(bmpfd,buf,800*480*3);
//     //添加一个字节
//     char bmp[800*480*4]={0};//每个像素点加入一个字节所以大小变成*4
//     for(int i=0,j=0;i<800*480*3;i+=3,j+=4)//i+=3:表示每隔RGB加入一个字节,j+=4:表示跳过ARGB
//     {
//         bmp[j]=buf[i];
//         bmp[j+1]=buf[i+1];
//         bmp[j+2]=buf[i+2];
//         bmp[j+3]=0;
//     }
// //     //4.将读取出来的图片数据写入到液晶屏上
// //     for(int i=0;i<800*480*4;i++)
// //     {
// //        p[i]=bmp[i];
// //     }

//     // 	int ret=0;
// 	int line=0;
// // 	int block=0;
// 	int i=0, j=0, k=0;
// // 	int bmp_fd=0;
// 	int mi_buf[480*800];
// 	for(line=0 ; line <=480 ;line++)//7、解决图片上下颠倒问题
// 	{
// 		for(i=0; i<=800 ; i++)
// 		mi_buf[800*line + i] = bmp[ (479-line)*800 + i ];
// 	}

// 	for(k=0; k<467; k+=3)//8、特殊动画“圆形扩散”效果算法
// 	{
// 		for(i=0; i<480; i++)
// 		{
// 			for(j=0; j<800; j++)
// 			{
// 				if((j-400)*(j-400)+(i-240)*(i-240) <= k*k)
// 				{
// 					p[800*i+j] = mi_buf[800*i+j];					
// 				}
// 			}
// 		}
// 	} 
//     // //4.将读取出来的图片数据写入到液晶屏上
//     // for(int i=0;i<800*480*4;i++)
//     // {
//     //    p[i]=mi_buf[i];
//     // }

//     //5.关闭液晶屏文件、bmp图片文件
//     close(lcdfd);
//     close(bmpfd);
//     return 0;
// }








// #include "show_bmp.h"

// #include <sys/types.h>
// #include <sys/stat.h>
// #include <sys/mman.h>
// #include <unistd.h>
// #include <fcntl.h>
// #include <stdio.h>
/*
图片特效：
	1）“圆形扩散”    2）”圆形收缩“   
	3）”向下飞入“    4）”向上飞入“   5）”向左飞入“   6）”向右飞入“
	7）”横百叶窗“    8）”竖百叶窗“    9）“左右相合”   10）“中间展开”
	11）“斜方块”
*/

/*
	功能：显示800*480大小的bmp图片。
	参数：
		char *pathname：要显示图片的名字。
		int *show_1152000bmp_fd：被映射区的指针。
	返回值：成功  0
			失败  -1
*/
// int show_1152000bmp(char *pathname, char *show_1152000bmp_fd)
// {
// 	//1、打开BMP格式图片和lcd显示屏
// 	int fd_bmp = open(pathname,  O_RDWR);
// 	if(fd_bmp == -1)
// 	{
// 		printf("show_1152000bmp(), open bmp fail!\n");
// 		return -1;
// 	}
	
// 	//2、去掉54个字节
// 	int ret = lseek(fd_bmp, 54, SEEK_SET);
// 	if(ret == -1)
// 	{
// 		printf("show_1152000bmp(), lseek bmp fail!\n");
// 		return -1;		
// 	}
	
// 	//3、读取BMP数据到lcd屏幕中
// 	char bmp_buf[800*480*3];
// 	int lcd_buf[800*480];
// 	// bzero(bmp_buf, 800*480*3);
// 	// bzero(lcd_buf, 800*480);
	
// 	ret = read(fd_bmp, bmp_buf, 800*480*3);//BMP数据放到了bmp_buf中
// 	if(ret == -1)
// 	{
// 		printf("show_1152000bmp(), read bmp fail!\n");
// 		return -1;		
// 	}		

// 	//4、关闭文件，回收资源
// 	close(fd_bmp);
	
// 	//5、800*480个A像素变成800*480个B像素算法。
// 	int i;
// 	for(i=0; i<800*480; i++)
// 	{
// 		lcd_buf[i] = bmp_buf[i*3]<<0 | bmp_buf[i*3+1]<<8 | bmp_buf[i*3+2]<<16;
// 		//lcd_buf[0] = bmp_buf[0]<<0 | bmp_buf[1]<<8 | bmp_buf[2]<<16;
// 		//lcd_buf[1] = bmp_buf[3]<<0 | bmp_buf[4]<<8 | bmp_buf[5]<<16;
// 		//lcd_buf[2] = bmp_buf[6]<<0 | bmp_buf[7]<<8 | bmp_buf[8]<<16;
// 	}
	
// 	//6、lcd_buf数据（DDR2中的数据）通过mmap显示到LCD屏幕中。
// /*
// 	for(i=0; i<800*480; i++)
// 	{
// 		*(lcd_mmap+i)=lcd_buf[i];
// 	}	
// */
// 	int x, y;
// 	for(y=0; y<480; y++)//优化算法，解决图片颠倒问题
// 	{
// 		for(x=0; x<800; x++)
// 		{
// 			*(show_1152000bmp_fd+800*(479-y)+x)= lcd_buf[800*y+x];
// 		}
// 	}
			
// 	return 0;
// }















int show_bmp(char *bmpname)
{
    //1.打开液晶屏文件
    int lcdfd = open("/dev/fb0",O_RDWR);
    if(lcdfd == -1)
    {
        printf("打开液晶屏失败\n");
        return 0;
    }
    //2.打开bmp图片文件
    int bmpfd = open(bmpname,O_RDWR);
    if(bmpfd == -1)
    {
        printf("打开图片失败\n");
        return 0;
    }
    //内存映射   
    char *p = mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcdfd,0);

    //3.读取bmp图片的数据
    char buf[800*480*3]={0};//800*480:图片像素点总数 *3：C的代码单位是字节
    //跳过表示图片信息的54个字节
    read(bmpfd,buf,54);
    read(bmpfd,buf,800*480*3);
    //添加一个字节
    char bmp[800*480*4]={0};//每个像素点加入一个字节所以大小变成*4
    for(int i=0,j=0;i<800*480*3;i+=3,j+=4)//i+=3:表示每隔RGB加入一个字节,j+=4:表示跳过ARGB
    {
        bmp[j]=buf[i];
        bmp[j+1]=buf[i+1];
        bmp[j+2]=buf[i+2];
        bmp[j+3]=0;
    }
    //4.将读取出来的图片数据写入到液晶屏上
    for(int i=0;i<800*480*4;i++)
    {
       p[i]=bmp[i];
    }
    //write(lcdfd, bmp, 800*480*4);
    //5.关闭液晶屏文件、bmp图片文件
    close(lcdfd);
    close(bmpfd);
    return 0;
}

int main()
{
    show_bmp("1.bmp");
    //内存映射   
    // char *p = mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcdfd,0);
    // pic_circular_spread("1.bmp");
}